package com.hsurosy.hsuchain.nft.web.configuration;

import com.fasterxml.jackson.core.filter.TokenFilter;
import org.redisson.api.RedissonClient;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

/**
 * Web 配置类
 *
 * @Author Hsu琛君珩
 * @Date 2024-10-05 5:13
 * @Description
 * @Version: v1.0.0
 */
@AutoConfiguration
@ConditionalOnWebApplication
public class WebConfiguration implements WebMvcConfigurer {

    /**
     * 配置全局异常处理器
     * <p>
     * 当没有其他异常处理器bean时，注册GlobalWebExceptionHandler。
     *
     * @return GlobalWebExceptionHandler 全局异常处理器
     */
    @Bean
    @ConditionalOnMissingBean
    GlobalWebExceptionHandler globalWebExceptionHandler() {
        return new GlobalWebExceptionHandler();
    }

    /**
     * 注册token过滤器
     * <p>
     * 该过滤器负责拦截特定路径的请求并处理token验证逻辑。
     * 在 "/trade/buy" 路径下应用TokenFilter，并且优先级设置为10。
     *
     * @param redissonClient Redisson客户端，用于分布式锁或其他操作
     * @return FilterRegistrationBean<TokenFilter> 过滤器注册Bean
     */
    @Bean
    public FilterRegistrationBean<TokenFilter> tokenFilter(RedissonClient redissonClient) {
        // 注册 TokenFilter 并配置其应用路径和顺序
        FilterRegistrationBean<TokenFilter> registrationBean = new FilterRegistrationBean<>();

        // 设置过滤器实例，并注入redissonClient作为依赖
        registrationBean.setFilter(new TokenFilter(redissonClient));
        // 配置过滤器拦截路径
        registrationBean.addUrlPatterns("/trade/buy");
        // 设置过滤器的执行顺序
        registrationBean.setOrder(10);

        return registrationBean;
    }

}
